package com.ffcs.crmd.tsp.api.netty;

import com.ffcs.crmd.tsp.api.dto.netty.RemotingCommand;
import com.ffcs.crmd.tsp.common.exception.TspRemotingException;
import com.ffcs.crmd.tsp.common.netty.NettyEvent;

import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.util.concurrent.DefaultEventExecutorGroup;

/**
 * 
 * 功能说明:服务端远程处理通信接口
 *
 * @author ZHONGFUHUA
 * 
 * @since 1.0.0-SNAPSHOT
 *
 */
public interface INettyRemotingServer {

    /**
     * 功能说明:启动服务端
     * 
     * @throws Exception
     */
    public void start() throws TspRemotingException;

    /**
     * 功能说明:关闭服务端
     * 
     */
    public void shutdown();
    
    /**
     * 功能说明: 获取本地server绑定的端口
     *
     * @return addr 本地server绑定的端口
     */
    public String getAddr();
    
    /**
     * 
     * 功能说明:注册RPC(远程过程调用协议)处理器
     * 
     * @param requestCode 请求编码
     * @param processor 处理请求类
     */
    public INettyRemotingServer registerProcessor(int requestCode, INettyProcessor processor);
    
    /**
     * 
     * 功能说明:同步调用
     * 
     * @param channel 请求通道
     * @param request 请求通信对象
     * @param reponseTimeoutMillis 超时时间
     * @return 返回结果
     * @throws TspRemotingException
     */
    public RemotingCommand invokeSync(Channel channel, RemotingCommand request, long reponseTimeoutMillis) throws TspRemotingException;
    
    /**
     * 
     * 功能说明:异步调用
     * 
     * @param channel 请求通道
     * @param request 请求通信对象
     * @param reponseTimeoutMillis 超时时间
     * @param invokeCallback 回调对象
     * @throws TspRemotingException
     */
    public void invokeAsync(Channel channel, RemotingCommand request, long reponseTimeoutMillis, INettyInvokeCallback invokeCallback, INettyInvokeCallback sendFailInvokeCallback);
    
    /**
     * 
     * 功能说明:异步调用
     * 
     * @param channel 请求通道
     * @param request 请求通信对象
     * @param reponseTimeoutMillis 超时时间
     * @param invokeCallback 回调对象
     * @throws TspRemotingException
     */
    public void invokeAsync(Channel channel, RemotingCommand request, long reponseTimeoutMillis, INettyInvokeCallback invokeCallback);
    
    /**
     * 功能说明:
     * 
     * @param channel 请求通道
     * @param request 请求通信对象
     * @param reponseTimeoutMillis 超时时间
     * @throws TspRemotingException
     */
    public void invokeAsync(Channel channel, RemotingCommand request, INettyInvokeCallback invokeCallback, INettyInvokeCallback sendFailInvokeCallback);

    /**
     * 功能说明:
     * 
     * @param channel 请求通道
     * @param request 请求通信对象
     * @param invokeCallback 回调对象
     * @throws TspRemotingException
     */
    public void invokeAsync(Channel channel, RemotingCommand request, INettyInvokeCallback invokeCallback);
    
    /**
     * 
     * 功能说明:oneway调用
     * 
     * @param channel 请求通道
     * @param request 请求通信对象
     */
    public void invokeOneway(Channel channel, RemotingCommand request);
    
    /**
     * 
     * 功能说明:服务端IDLE事件超时时间
     * 
     */
    public int getServerChannelMaxIdleTimeSeconds();

    /**
     * 
     * 功能说明:移除缓存中的response
     * @param <T>
     * 
     * @param opaque 通信体标识
     * @return 
     *
     */
    public void removeResponse(int opaque);
    
    /**
     * 
     * 功能说明:添加netty事件
     * 
     * @param event 事件
     */
    public void putNettyEvent(NettyEvent event);
    
    /**
     * 
     * 功能说明:处理远程终端发送过来的命令
     * 
     * @param ctx 上下文
     * @param remotingCommand 远程命令
     */
    public void processMessageReceived(ChannelHandlerContext ctx, RemotingCommand remotingCommand);

    /**
     * 功能说明:
     * 
     * @param channel
     * @param request
     * @return
     * @throws TspRemotingException
     */
    RemotingCommand invokeSync(Channel channel, RemotingCommand request) throws TspRemotingException;

    /**
     * 功能说明:
     * 
     * @return
     */
    DefaultEventExecutorGroup getDefaultEventExecutorGroup();


    
}
